# -*- coding: utf-8 -*-
import re
from utils import clean_str, bulkreplace

_wikiinline_rules = (
    # ============ Ссылки ============
    (re.compile('\[\[([^\s\[\]]*)[ ]([^\[\]]*)\]\]', re.M), '<a href="\g<1>">\g<2></a>'),
    (re.compile('\(\(([^\s\(\)]*)[ ]([^\(\)]*)\)\)', re.M), '<a href="\g<1>">\g<2></a>'),        
    # ============ Болд ============
    (re.compile('\*\*([^\n]+?)\*\*', re.M), '<b>\g<1></b>'),
    # ============ Курсив ============
    #(re.compile('(?<=\s|^)//([^\n]+?)//(?=\s|$)', re.M), '<i>\g<1></i>'),        
    (re.compile('//([^\n]+?)//', re.M), '<i>\g<1></i>'),        
)

_blockopentags = '<(?:ul|ol|h\d)[^>]*>'
_blockclosetags = '</(?:ul|ol|h\d)>'

_wikiblock_rules = (    
    # ============ Заголовки ============
    (re.compile('====([^\n=]+)====', re.M), '<h3>\g<1></h3>'),
    (re.compile('===([^\n=]+)==='  , re.M), '<h2>\g<1></h2>'),
    (re.compile('==([^\n=]+)=='    , re.M), '<h1>\g<1></h1>'),
    # ============ Список ============
    # всё сначала меняем на маски, чтобы не перекрыть <li>, которые мы вносим руками в код
    # $text[^text.match[^^  \* (.*)^$][gim]{RegexpMaskA1${match.1}RegexpMaskA2}]
    (re.compile('^  \* (.*)$'      , re.M), 'RegexpMaskA1\g<1>1RegexpMaskA2'),
    # -- меняем все <li>\n</li> на временную маску №3
    # $text[^text.match[RegexpMaskA2\nRegexpMaskA1][gim]{RegexpMaskA3}]
    ('RegexpMaskA2\nRegexpMaskA1', 'RegexpMaskA3'),
    # -- добавляем ко всем оставшимся (открывающим и закрывающим) <li> и </li> <ul>
    # $text[^text.match[RegexpMaskA1][gim]{<ul><li>}]
    # $text[^text.match[RegexpMaskA2][gim]{</li></ul>}]
    ('RegexpMaskA1', '<ul><li>'),
    ('RegexpMaskA2', '</li></ul>'),
    # -- меняем назад временную маску №3
    # $text[^text.match[RegexpMaskA3][gim]{</li>
    # <li>}]
    ('RegexpMaskA3', '</li><li>'),        
    # ============ Нумерованный список ============
    # $text[^text.match[^^  \d+\.(.*)^$][gim]{RegexpMask1${match.1}RegexpMask2}]
    (re.compile('^  \d+\.(.*)$', re.M), 'RegexpMask1\g<1>RegexpMask2'),        
    # -- меняем все <li>\n</li> на временную маску №3
    # $text[^text.match[RegexpMask2\nRegexpMask1][gim]{RegexpMask3}]
    ('RegexpMask2\nRegexpMask1', 'RegexpMask3'),        
    # -- добавляем ко всем оставшимся (открывающим и закрывающим) <li> и </li> <ul>
    # $text[^text.match[RegexpMask1][gim]{<ol><li>}]
    # $text[^text.match[RegexpMask2][gim]{</li></ol>}]
    ('RegexpMask1', '<ol><li>'),
    ('RegexpMask2', '</li></ol>'),        
    # -- меняем назад временную маску №3
    # $text[^text.match[RegexpMask3][gim]{</li>
    # <li>}]
    ('RegexpMask3', '</li><li>'),
    # -- абзацы
    # удаляем все пробелы, которые не нужны для определения межабзацного расстояния
    (re.compile('(%s)\s+(%s)' % (_blockclosetags, _blockopentags)), '\g<1>\g<2>'),
    # после закрывающих блочных - открывающий <p>    
    (re.compile('(%s)' % _blockclosetags), '\g<1><p>'),
    # перед открывающими блочными - закрывающий </p>
    (re.compile('(%s)' % _blockopentags), '</p>\g<1>'),
    # в междустрочье -- закрывающий-открывающий <p>    
    (re.compile(u'(\n[ \t]*){2,}'), u'</p><p>'),
    # убираем лишние <p>
    # одиноко зависшие в пустом пространстве меж тэгами и в начале / конце
    (re.compile('(^|%s)\s*(?:<p>)?\s*(?:</p>)?\s*(%s|$)' % (_blockclosetags, _blockopentags)), '\g<1>\g<2>'),
)
            
def wikiinline(s):
    return bulkreplace(clean_str(s), _wikiinline_rules) 

def wikiblock(s):
    return bulkreplace('<p>%s</p>' % clean_str(s), _wikiblock_rules + _wikiinline_rules) 
